import os
from datetime import datetime
from functools import wraps

from CrawlCenter.settings import BASE_DIR, STATIC_URL

from tools.verification import verification


def parse_parameter(func):
    """
    参数解析
    :param func: view方法
    :return: wrap
    """

    @wraps(func)
    def wrap(request, *args, **kwargs):
        """
        解析parameter参数
        :param request: HTTP请求
        :param args: 参数元组
        :param kwargs: 参数字典
        :return: view方法返回值
        """
        # 提取参数
        parameter = _parse_parameter(request)
        return func(request, parameter, *args, **kwargs)

    return wrap


def _parse_parameter(req):
    """
    简单读取请求中的参数，不包含JSON，POST优先
    :param req: 请求体
    :return: 参数字典
    """
    # 初始化返回值
    result = {}
    for item in req.GET:
        result[item] = "".join(req.GET[item])
    for item in req.POST:
        result[item] = "".join(req.POST[item])
    return result


def check_parameter(config, callback):
    """
    [强校验]参数校验装饰器
    :param config: 参数校验规则
    :param callback: 校验出错回调
    :return: wrap
    """

    @wraps(config)
    def wrap(func):
        """
        内嵌装饰器
        :param func: view方法
        :return: inner_wrap
        """

        @wraps(func)
        def inner_wrap(request, parameter, *args, **kwargs):
            """
            校验parameter参数
            :param request: HTTP请求
            :param parameter: 参数字典
            :param args: 参数元组
            :param kwargs: 参数字典
            :return: view方法返回值
            """
            # 格式校验
            b, message = verification.Helper(parameter, config).check()
            if not b:
                return callback(message)
            return func(request, parameter, *args, **kwargs)

        return inner_wrap

    return wrap


def match_parameter(config, callback):
    """
    [弱校验]参数校验装饰器
    :param config: 参数校验规则
    :param callback: 校验出错回调
    :return: wrap
    """

    @wraps(config)
    def wrap(func):
        """
        内嵌装饰器
        :param func: view方法
        :return: inner_wrap
        """

        @wraps(func)
        def inner_wrap(request, parameter, *args, **kwargs):
            """
            校验parameter参数
            :param request: HTTP请求
            :param parameter: 参数字典
            :param args: 参数元组
            :param kwargs: 参数字典
            :return: view方法返回值
            """
            # 格式校验
            b, message = verification.Helper(parameter, config).weak_check()
            if not b:
                return callback(message)
            return func(request, parameter, *args, **kwargs)

        return inner_wrap

    return wrap


